<?php

declare(strict_types=1);

use think\migration\Migrator;

class CreateCartTables extends Migrator
{
    public function change(): void
    {
        $this->createCartTable();
        $this->createCartStockTable();
        $this->createCartFutureTable();
    }

    private function createCartTable(): void
    {
        $this->table('cart', [
            'comment' => '购物车主表',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
        ])
            ->addColumn('buyer_id', 'integer', [
                'signed' => false,
                'comment' => '买家用户ID',
            ])
            ->addColumn('buyer_org_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '买家组织ID',
            ])
            ->addColumn('seller_org_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '卖家组织ID',
            ])
            ->addColumn('product_id', 'integer', [
                'signed' => false,
                'comment' => '商品ID',
            ])
            ->addColumn('sku_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => 'SKU ID',
            ])
            ->addColumn('qty', 'integer', [
                'default' => 1,
                'comment' => '数量',
            ])
            ->addColumn('snapshot_price', 'decimal', [
                'precision' => 12,
                'scale' => 2,
                'null' => true,
                'comment' => '价格快照',
            ])
            ->addColumn('snapshot_currency', 'string', [
                'limit' => 10,
                'default' => 'CNY',
                'comment' => '币种快照',
            ])
            ->addColumn('snapshot_attrs', 'json', [
                'null' => true,
                'comment' => '属性快照',
            ])
            ->addColumn('source_type', 'string', [
                'limit' => 20,
                'default' => 'manual',
                'comment' => '来源类型',
            ])
            ->addColumn('channel', 'string', [
                'limit' => 20,
                'default' => 'web',
                'comment' => '来源渠道',
            ])
            ->addColumn('status', 'tinyinteger', [
                'signed' => false,
                'default' => 1,
                'comment' => '状态 1-有效 0-无效',
            ])
            ->addColumn('remark', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => '备注',
            ])
            ->addTimestamps()
            ->addColumn('delete_time', 'timestamp', [
                'null' => true,
                'comment' => '删除时间',
            ])
            ->addIndex(['buyer_id'])
            ->addIndex(['buyer_org_id'])
            ->addIndex(['seller_org_id'])
            ->addIndex(['product_id'])
            ->create();
    }

    private function createCartStockTable(): void
    {
        $this->table('cart_stock', [
            'comment' => '现货核实记录',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
        ])
            ->addColumn('verify_no', 'string', [
                'limit' => 40,
                'comment' => '核实单号',
            ])
            ->addColumn('buyer_id', 'integer', [
                'signed' => false,
                'comment' => '买家用户ID',
            ])
            ->addColumn('buyer_org_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '买家组织ID',
            ])
            ->addColumn('seller_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '卖家用户ID',
            ])
            ->addColumn('seller_org_id', 'integer', [
                'signed' => false,
                'comment' => '卖家组织ID',
            ])
            ->addColumn('region_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '所属区域ID',
            ])
            ->addColumn('assist_user_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '客服用户ID',
            ])
            ->addColumn('product_id', 'integer', [
                'signed' => false,
                'comment' => '商品ID',
            ])
            ->addColumn('sku_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => 'SKU ID',
            ])
            ->addColumn('buyer_qty', 'integer', [
                'default' => 1,
                'comment' => '买家需求数量',
            ])
            ->addColumn('snapshot_price', 'decimal', [
                'precision' => 12,
                'scale' => 2,
                'null' => true,
                'comment' => '价格快照',
            ])
            ->addColumn('snapshot_currency', 'string', [
                'limit' => 10,
                'default' => 'CNY',
                'comment' => '币种快照',
            ])
            ->addColumn('snapshot_product', 'json', [
                'null' => true,
                'comment' => '商品快照',
            ])
            ->addColumn('buyer_time', 'timestamp', [
                'null' => true,
                'comment' => '买家发起时间',
            ])
            ->addColumn('buyer_remark', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => '买家备注',
            ])
            ->addColumn('buyer_media', 'json', [
                'null' => true,
                'comment' => '买家附件',
            ])
            ->addColumn('seller_qty', 'integer', [
                'default' => 0,
                'comment' => '卖家确认数量',
            ])
            ->addColumn('seller_remark', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => '卖家备注',
            ])
            ->addColumn('seller_media', 'json', [
                'null' => true,
                'comment' => '卖家附件',
            ])
            ->addColumn('seller_time', 'timestamp', [
                'null' => true,
                'comment' => '卖家回复时间',
            ])
            ->addColumn('status', 'tinyinteger', [
                'signed' => false,
                'default' => 0,
                'comment' => '状态 0-待核实 1-已核实 2-已拒绝 3-已取消',
            ])
            ->addColumn('audit_status', 'tinyinteger', [
                'signed' => false,
                'default' => 0,
                'comment' => '审核状态 0-待审核 1-通过 2-驳回',
            ])
            ->addColumn('audit_remark', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => '审核备注',
            ])
            ->addColumn('audit_time', 'timestamp', [
                'null' => true,
                'comment' => '审核时间',
            ])
            ->addColumn('order_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '关联订单ID',
            ])
            ->addColumn('order_no', 'string', [
                'limit' => 60,
                'default' => '',
                'comment' => '关联订单号',
            ])
            ->addTimestamps()
            ->addColumn('delete_time', 'timestamp', [
                'null' => true,
                'comment' => '删除时间',
            ])
            ->addIndex(['verify_no'], ['unique' => true])
            ->addIndex(['buyer_id'])
            ->addIndex(['seller_org_id'])
            ->addIndex(['status'])
            ->create();
    }

    private function createCartFutureTable(): void
    {
        $this->table('cart_future', [
            'comment' => '期货询价记录',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
        ])
            ->addColumn('inquiry_no', 'string', [
                'limit' => 40,
                'comment' => '询价单号',
            ])
            ->addColumn('buyer_id', 'integer', [
                'signed' => false,
                'comment' => '买家用户ID',
            ])
            ->addColumn('buyer_org_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '买家组织ID',
            ])
            ->addColumn('seller_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '卖家用户ID',
            ])
            ->addColumn('seller_org_id', 'integer', [
                'signed' => false,
                'comment' => '卖家组织ID',
            ])
            ->addColumn('region_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '所属区域ID',
            ])
            ->addColumn('assist_user_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '客服用户ID',
            ])
            ->addColumn('product_id', 'integer', [
                'signed' => false,
                'comment' => '商品ID',
            ])
            ->addColumn('sku_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => 'SKU ID',
            ])
            ->addColumn('buyer_qty', 'integer', [
                'default' => 1,
                'comment' => '买家需求数量',
            ])
            ->addColumn('buyer_expected_price', 'decimal', [
                'precision' => 12,
                'scale' => 2,
                'null' => true,
                'comment' => '买家期望价格',
            ])
            ->addColumn('buyer_expected_currency', 'string', [
                'limit' => 10,
                'default' => 'CNY',
                'comment' => '期望币种',
            ])
            ->addColumn('buyer_expected_date', 'date', [
                'null' => true,
                'comment' => '期望交期',
            ])
            ->addColumn('buyer_remark', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => '买家备注',
            ])
            ->addColumn('buyer_media', 'json', [
                'null' => true,
                'comment' => '买家附件',
            ])
            ->addColumn('buyer_time', 'timestamp', [
                'null' => true,
                'comment' => '买家提交时间',
            ])
            ->addColumn('seller_price', 'decimal', [
                'precision' => 12,
                'scale' => 2,
                'null' => true,
                'comment' => '卖家报价',
            ])
            ->addColumn('seller_currency', 'string', [
                'limit' => 10,
                'default' => 'CNY',
                'comment' => '卖家报价币种',
            ])
            ->addColumn('seller_delivery_date', 'date', [
                'null' => true,
                'comment' => '卖家交付日期',
            ])
            ->addColumn('seller_remark', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => '卖家备注',
            ])
            ->addColumn('seller_media', 'json', [
                'null' => true,
                'comment' => '卖家附件',
            ])
            ->addColumn('seller_time', 'timestamp', [
                'null' => true,
                'comment' => '卖家回复时间',
            ])
            ->addColumn('snapshot_product', 'json', [
                'null' => true,
                'comment' => '商品快照',
            ])
            ->addColumn('status', 'tinyinteger', [
                'signed' => false,
                'default' => 0,
                'comment' => '状态 0-询价中 1-已报价 2-已拒绝 3-已取消',
            ])
            ->addColumn('quote_count', 'integer', [
                'default' => 0,
                'comment' => '报价次数',
            ])
            ->addColumn('last_quote_time', 'timestamp', [
                'null' => true,
                'comment' => '最后报价时间',
            ])
            ->addColumn('order_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '关联订单ID',
            ])
            ->addColumn('order_no', 'string', [
                'limit' => 60,
                'default' => '',
                'comment' => '关联订单号',
            ])
            ->addTimestamps()
            ->addColumn('delete_time', 'timestamp', [
                'null' => true,
                'comment' => '删除时间',
            ])
            ->addIndex(['inquiry_no'], ['unique' => true])
            ->addIndex(['buyer_id'])
            ->addIndex(['seller_org_id'])
            ->addIndex(['status'])
            ->create();
    }
}
